﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;

typedef int STDataType;
class Stack
{
public:
	Stack(int n )
	{
		cout << "Stack(int n = 4)" << endl;

		_a = (STDataType*)malloc(sizeof(STDataType) * n);
		if (nullptr == _a)
		{
			perror("malloc申请空间失败");
			return;
		}
		_capacity = n;
		_top = 0;
	}
	
	// st2(st1)
	Stack(const Stack& st)
	{
		// 需要对_a指向资源创建同样大的资源再拷贝值
		_a = (STDataType*)malloc(sizeof(STDataType) * st._capacity);
		if (nullptr == _a)
		{
			perror("malloc申请空间失败!!!");
			return;
		}
		memcpy(_a, st._a, sizeof(STDataType) * st._top);
		_top = st._top;
		_capacity = st._capacity;
	}

	// st1 = st3
	// st1 = st1;
	Stack& operator=(const Stack& st)
	{
		if (this != &st)
		{
			free(_a);
			_a = (STDataType*)malloc(sizeof(STDataType) * st._capacity);
			if (nullptr == _a)
			{
				perror("malloc申请空间失败!!!");
				return *this;
			}
			memcpy(_a, st._a, sizeof(STDataType) * st._top);
			_top = st._top;
			_capacity = st._capacity;
		}

		return *this;
	}

	void Push(STDataType x)
	{
		if (_top == _capacity)
		{
			int newcapacity = _capacity * 2;
			STDataType* tmp = (STDataType*)realloc(_a, newcapacity *
				sizeof(STDataType));
			if (tmp == NULL)
			{
				perror("realloc fail");
				return;
			}
			_a = tmp;
			_capacity = newcapacity;
		}
		_a[_top++] = x;
	}

	void Pop()
	{
		_a[_top - 1] = -1;
		--_top;
	}

	int Top()
	{
		return _a[_top - 1];
	}

	~Stack()
	{
		cout << "~Stack()" << endl;
		free(_a);
		//_a = nullptr;
		//_top = _capacity = 0;
	}
private:
	STDataType* _a;
	size_t _capacity;
	size_t _top;
};

class MyQueue
{
public:
	MyQueue()
		:_pushst(200)
	{

	}
private:
	// 成员变量声明
	//C++ 声明可以给缺省值
	Stack _pushst = 1000;
	Stack _popst = 2000;

	int _size;
};

class stack
{
public:
	void Push(const A& aa)
	{

	}
};

class A
{
public:
	// 构造函数explicit就不再⽀持隐式类型转换
	// explicit A(int a1)
	A(int a1)
		:_a1(a1)
	{}
	//explicit A(int a1, int a2)
	A(int a1, int a2)
		:_a1(a1)
		, _a2(a2)
	{}
	void Print()
	{
		cout << _a1 << " " << _a2 << endl;
	}
private:
	int _a1 = 1;
	int _a2 = 2;
};

//int main()
//{
//	A aa1(1);
//	A aa2(1,1);
//
//	A a33 = 1;
//	const A& aa4 = 1;
//
//	stack st;
//	A aa5(6);
//	st.Push(aa5);
//
//	A aa6(6,6);
//	st.Push(aa6);
//
//	st.Push(6);
//	st.Push({6,6});
//	return 0;
//}



#include<iostream>
using namespace std;
// 前置声明，否则A的友元函数声明编译器不认识B
class B;
class A
{
	// 友元声明
	friend void func(const A& aa, const B& bb);
private:
	int _a1 = 1;
	int _a2 = 2;
};
class B
{
// 友元声明
	friend void func(const A & aa, const B & bb);
private:
	int _b1 = 3;
	int _b2 = 4;
};

void func(const A & aa, const B & bb)
{
	cout << aa._a1 << endl;
	cout << bb._b1 << endl;
}

 int main()
 {
    A aa;
	B bb;
	func(aa, bb);

	 return 0;
}


//int main()
//{
//	int x = 0;
//
//	// 对象整体定义
//	MyQueue q;
//
//	return 0;
//}


//#include<iostream>
//using namespace std;
//class A
//{
//public:
//	A(int a)
//		:_a1(a)
//		, _a2(_a1)
//	{}
//	void Print() {
//		cout << _a1 << " " << _a2 << endl;
//	}
//private:
//	int _a2 = 2;
//	int _a1 = 2;
//};
//int main()
//{
//	A aa(1);
//	aa.Print();
//}